/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pt.iasd.youthshelter.wizards.core.events.investiture;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.ResourceBundle;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import org.openide.WizardDescriptor;
import org.openide.util.HelpCtx;
import pt.iasd.youthshelter.datamodel.Honor;
import pt.iasd.youthshelter.datamodel.Pathfinder;
import pt.iasd.youthshelter.wizards.core.WizardKeys;

public class AddInvestitureDetailsWizardPanel implements WizardDescriptor.Panel<WizardDescriptor>, PropertyChangeListener {
    private static final ResourceBundle bundle = java.util.ResourceBundle.getBundle("pt/iasd/youthshelter/wizards/core/Bundle");

    /**
     * The visual component that displays this panel. If you need to access the
     * component from this class, just use getComponent().
     */
    private InvestitureDetailsVisualPanel component;
    
    private WizardDescriptor descriptor;
    
    private final EventListenerList listeners = new EventListenerList();
    
    private boolean isValid = false;
    
    private List<Pathfinder> currentPathfinders;

    // Get the visual component for the panel. In this template, the component
    // is kept separate. This can be more efficient: if the wizard is created
    // but never displayed, or not all panels are displayed, it is better to
    // create only those which really need to be visible.
    @Override
    public InvestitureDetailsVisualPanel getComponent() {
        if (component == null) {
            component = new InvestitureDetailsVisualPanel();
        }
        component.putClientProperty(WizardDescriptor.PROP_AUTO_WIZARD_STYLE, true);
        return component;
    }

    @Override
    public HelpCtx getHelp() {
        // Show no Help button for this panel:
        return HelpCtx.DEFAULT_HELP;
        // If you have context help:
        // return new HelpCtx("help.key.here");
    }

    @Override
    public boolean isValid() {
        // If it is always OK to press Next or Finish, then:
        return isValid;
        // If it depends on some condition (form filled out...) and
        // this condition changes (last form field filled in...) then
        // use ChangeSupport to implement add/removeChangeListener below.
        // WizardDescriptor.ERROR/WARNING/INFORMATION_MESSAGE will also be useful.
    }

    @Override
    public void addChangeListener(ChangeListener l) {
        listeners.add(ChangeListener.class, l);
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
        listeners.remove(ChangeListener.class, l);
    }

    @Override
    public void readSettings(WizardDescriptor wiz) {
        this.descriptor = wiz;
        currentPathfinders = (List<Pathfinder>)wiz.getProperty(WizardKeys.PROP_PATHFINDER_LIST);
        getComponent().addPropertyChangeListener(this);
    }

    @Override
    public void storeSettings(WizardDescriptor wiz) {
        wiz.putProperty(WizardKeys.PROP_PATHFINDER, component.getPathfinderComboBox().getSelectedItem());
        wiz.putProperty(WizardKeys.PROP_LIDER, component.getLiderComboBox().getSelectedItem());
        if(component.getClubComboBox().isEnabled()) {
            wiz.putProperty(WizardKeys.PROP_CLUB, component.getClubComboBox().getSelectedItem());
        }
        if(component.getClassComboBox().isEnabled()) {
            wiz.putProperty(WizardKeys.PROP_PCLASS, component.getClassComboBox().getSelectedItem());
        }
        /*TODO If wizard gets NullPointerException while adding an investiture
         * without any associated honors change code to return empty list
         * instead of null. */
        List<Honor> received = (List<Honor>) component.getReceived();
        if(received != null && !received.isEmpty()) {
            wiz.putProperty(WizardKeys.PROP_HONOR_LIST, received);
        }
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        boolean oldState = isValid;
        if(currentPathfinders != null && currentPathfinders.contains(
                (Pathfinder)component.getPathfinderComboBox().getSelectedItem())) {
            isValid = false;
            descriptor.getNotificationLineSupport().setErrorMessage(
                    bundle.getString("Investiture.Pathfinder.Exist.Error"));
        } else {
            if(component.hasCheckBoxSelected()) {
                isValid = true;
                descriptor.getNotificationLineSupport().clearMessages();
            } else {
                isValid = false;
                descriptor.getNotificationLineSupport().setErrorMessage(
                        bundle.getString("Investiture.NoDetails.Error"));
            }
        }
        if(oldState != isValid) {
            ChangeEvent event = new ChangeEvent(this);
            for(ChangeListener listener : listeners.getListeners(ChangeListener.class)) {
                listener.stateChanged(event);
            }
        }
    }
}
